/*
  需求：在终端输出文本 hello world
 流程：
     1.包含头文件
     2.初始化ROS2客户端
     3.创建节点指针
     4.输出日志
     5.释放资源
*/

//1.包含头文件
#include "rclcpp/rclcpp.hpp"

// 编码方式一 （不推荐） 来源：《1.3.2_ROS2快速体验_HelloWorld(C++)_01基本流程》
/* int main(int argc, char ** argv)
{
  // 2.初始化 ROS2客户端
  rclcpp::init(argc,argv);
  // 3.创建节点指针
  auto node = rclcpp::Node::make_shared("helloworld_node");
  // 4.输出日志
  RCLCPP_INFO(node->get_logger(),"hello world!");
  // 5.释放资源
  rclcpp::shutdown();
  
  return 0;
} */


// 编码方式二 继承（推荐） 来源：《1.5.1_ROS2体系框架_文件系统_02编码风格说明》
// 自定义继承 Node 
class Mynode: public rclcpp::Node{
public:
      Mynode():Node("hello_node_cpp"){
        RCLCPP_INFO(this->get_logger(),"hello world!(继承方式)");
      }
};

/* 
  《1.5.1_ROS2体系框架_文件系统_03编码之初始化与资源释放》
  问题：初始化与资源释放在程序中起什么作用？
  答：
    1.前提：构建的程序可能由若干步骤或阶段组成；
      初始化-->节点对象-->日志输出-->数据发布-->数据订阅-->...-->资源释放。
    2.不同步骤或阶段之间涉及到数据的传递
    3.怎么实现书记的传递呢？
      使用Context(上下文)对象，这是一个容器，可以存储数据，也可以读取数据
    4.初始化其实就是创建Context对象，资源释放就是要销毁Context对象。
*/

int main(int argc, char const *argv[])
{
  // 2.初始化
  rclcpp::init(argc,argv);

  // 3.实例化自定义类
  auto node = std::make_shared<Mynode>();

  // 5.释放资源
  rclcpp::shutdown();

  return 0;
}
